import axios from 'axios'
switch (process.env.NODE_ENV) {
    case 'production':
        axios.baseURL = '/api';
        break;
    case 'test':
        axios.baseURL = '/test';
        break;
    default:
        axios.baseURL = '/api';
}
const instance = axios.create({
    baseURL: '/api',
    timeout: 4000
})
let requestList = new Set() // 所有经过拦截器的请求url存储空间
instance.interceptors.request.use(config => {
    let token = localStorage.getItem('token');
    console.log('request.js:token=', token);

    // token时候存在，每一次向服务器发送请求都要带上token
    token && (config.headers.Authorization = token)
    // 利用cancelToken 取消当次请求
    // config.cancelToken = new axios.CancelToken(c => {
    //     console.log('config.url=', config.url)
    //     // 在这里阻止重复请求，上个请求未完成时，相同的请求不会再次执行
    //     requestList.has(config.url) ? c(`${location.host}${config.url}---重复请求被中断`) : requestList.add(config.url)
    // })
    return config
}, error => Promise.reject(error))

instance.interceptors.response.use(
    response => {
    console.log('response=', response)
    // 响应成功删除存储的url,防止下次请求被取消
    requestList.delete(`${response.config.url}`)
    console.log('delete-cancel=', '响应成功删除存储的url,防止下次请求被取消')
    return response;
  },
  error => {
             // 响应错误也需要删除存储的url
             requestList.delete(
               `${
                 error.message
                   ? error.message.split("---")[0]
                   : error.split("---")[0]
               }`
             );
             let { res } = error;
             if (res) {
               //服务器最起码返回结果了
               switch (res.status) {
                 case 401: // 当前请求需要用户验证
                   break;
                 case 403: // 服务器拒绝执行（token过期）
                   localStorage.removeItem("token");
                   break;
                 case 404: // 找不到页面
                   break;
                 default:
                   break;
               }
             } else {
               //服务器连结果都没有返回
               // 断网处理：可以跳转到断网页面
               if (!window.navigator.onLine) {
                 return;
               }
               return Promise.reject(error);
             }
           }
);
export const $get = async(url, params) => await instance.get(url, { params })
export const $post = async(url, params) => await instance.post(url, params)
export default instance